package com.glela.platform.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.glela.common.BaseSqlMapper;
import com.glela.platform.model.UserJournal;
import com.glela.platform.model.UserMoney;
import com.glela.platform.model.UserPointJournal;

public interface UserMoneyMapper extends BaseSqlMapper<UserMoney> {
    int deleteByPrimaryKey(Long id);

    int insert(UserMoney userMoney);

    int insertSelective(UserMoney userMoney);

    UserMoney selectByPrimaryKey(Long id);
    
    UserMoney selectByTypeIDAndUserID(@Param("userID")Long userID,@Param("typeID")Integer typeID);

    int updateByPrimaryKeySelective(UserMoney userMoney);
    
    /**
	 * 增加账户余额
	 * @param UserID 用户ID
	 * @param type   增加类型(积分 余额)
	 * @param Money  变化金额
	 * @author gaoweiqi
	 * @date 2017年8月23日 12:44:05
	 */
    int increaseUserAmount(@Param("UserID") Long UserID,@Param("type") int type,@Param("Money") long Money);
    
    /**
	 * 增加账户冻结余额
	 * @param UserID 用户ID
	 * @param type   增加类型(积分 余额)
	 * @param Money  变化金额
	 * @author gaoweiqi
	 * @date 2017年8月23日 12:44:05
	 */
    int increaseUserFreezeAmount(@Param("UserID") Long UserID,@Param("type") int type,@Param("Money") long Money);

    /**
	 * 减少账户余额
	 * @param UserID 用户ID
	 * @param type   减少类型(积分 余额)
	 * @param Money  变化金额
	 * @author gaoweiqi
	 * @date 2017年8月23日 12:44:05
	 */
    int reduceUserAmount(@Param("UserID") Long UserID,@Param("type") int type,@Param("Money") long Money);
    
    /**
	 * 减少账户冻结余额
	 * @param UserID 用户ID
	 * @param type   减少类型(积分 余额)
	 * @param Money  变化金额
	 * @author gaoweiqi
	 * @date 2017年8月23日 12:44:05
	 */
    int reduceUserFreezeAmount(@Param("UserID") Long UserID,@Param("type") int type,@Param("Money") long Money);
    
    int updateByPrimaryKey(UserMoney userMoney);

	/**
	 * <dl>
	 * <dt>查询用户余额记录</dt>
	 * </dl>
	 * @param userId 用户ID
	 * @return List<UserMoney>
	 * @author zls
	 * @date 2017年8月25日 下午5:01:03
	 */
	List<UserMoney> selectByUserId(long userId); 
    
	List<UserMoney> selectAllByUserIdAndType(@Param("userId") Long userId,@Param("type") int type);

	int subUserMoneyByUserIDAndType(@Param("userId") Long userId,@Param("money") int money,@Param("type")int type);

	 /**
		 * 批量插入账户余额
		 * @param UserID userJournalList户ID
		 * @author gaoweiqi
		 * @date 2017年8月26日 12:44:05
		 */
	int BatchIncreaseUserAmount(List<UserJournal> userJournalList);

	/**
	 * 批量插入账户妆币
	 * @param userPointJournalList
	 * @author gaoweiqi
	 * @date 2017年8月26日 12:44:05
	 */
	int BatchIncreaseUserPoint(List<UserPointJournal> userPointJournalList); 

	/**
	 * <dl>
	 * <dt>冻结用户账户金额</dt>
	 * <dd>减可用，价冻结</dd>
	 * </dl>
	 * @param id 记录ID
	 * @param userId 用户ID
	 * @param freezeAmount 要冻结的冻结金额数
	 * @return int 影响行
	 * @author zls
	 * @date 2017年8月31日 下午5:32:37
	 */
	int updateFreezeAmount(@Param("id") long id, @Param("userId") long userId, @Param("freezeAmount") long freezeAmount);

	/**
	 * <dl>
	 * <dt>扣减用户可用金额</dt>
	 * <dd>减可用</dd>
	 * </dl>
	 * @param id 记录id
	 * @param userId 用户ID
	 * @param subNormalAmount 要扣减的可用金额数
	 * @return int 影响行
	 * @author zls
	 * @date 2017年9月5日 下午12:11:20
	 */
	int updateSubNormalAmount(@Param("id") long id, @Param("userId") Long userId, @Param("subNormalAmount") long subNormalAmount);

	/**
	 * <dl>
	 * <dt>扣减用户冻结金额</dt>
	 * <dd>减冻结</dd>
	 * </dl>
	 * @param id 记录id
	 * @param userId 用户ID
	 * @param subFrozenAmount 要扣减的冻结金额数
	 * @return int 影响行数
	 * @author zls
	 * @date 2017年9月5日 下午3:23:06
	 */
	int updateSubFrozenAmount(@Param("id") long id, @Param("userId") Long userId, @Param("subFrozenAmount") Integer subFrozenAmount);

	/**
	 * <dl>
	 * <dt>释放冻结金额</dt>
	 * <dd>减冻结，加可用</dd>
	 * </dl>
	 * @param id 记录ID
	 * @param userId 用户ID
	 * @param releaseFreezeAmount 要释放的冻结金额数
	 * @return int 影响行数
	 * @author zls
	 * @date 2017年9月6日 下午3:24:02
	 */
	int updateReleaseFreezeAmount(@Param("id") long id, @Param("userId") Long userId, @Param("releaseFreezeAmount")Integer releaseFreezeAmount);

	/**
	 * <dl>
	 * <dt>查询账户余额异常用户</dt>
	 * </dl>
	 * @author gwq
	 * @date 2017年11月07日 下午3:24:02
	 */
	List<Map<String, Object>> validationUserMoney();

	/**
	 * <dl>
	 * <dt>检查流水是否有重复</dt>
	 * </dl>
	 * @author gwq
	 * @date 2018年05月03日 下午3:24:02
	 */
	List<Map<String, Object>> validationUserJournal();

	/**
	 * <dl>
	 * <dt>验证账户的冻结金额不能是负的</dt>
	 * </dl>
	 * @author gwq
	 * @date 2018年05月03日 下午3:24:02
	 */
	List<Map<String, Object>> validationUserMoney2(); 
	/**
	 * <dl>
	 * <dt>用户金额为负数 不能有提现记录</dt>
	 * </dl>
	 * @author gwq
	 * @date 2018年05月03日 下午3:24:02
	 */
	List<Map<String, Object>> validationWithdrawCash(); 
}
